{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quantum Process Tomography with Q# and Python #"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Abstract ##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this sample, we will demonstrate interoperability between Q# and Python by using the QInfer and QuTiP libraries for Python to characterize and verify quantum processes implemented in Q#.\n",
    "In particular, this sample will use *quantum process tomography* to learn about the behavior of a \"noisy\" Hadamard operation from the results of random Pauli measurements."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preamble ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.simplefilter('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can enable Q# support in Python by importing the `qsharp` package."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import qsharp "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we do so, any Q# source files in the current working directory are compiled, and their namespaces are made available as Python modules.\n",
    "For instance, the `Quantum.qs` source file provided with this sample implements a `HelloWorld` operation in the `Microsoft.Quantum.Samples.Python` Q# namespace:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "// Copyright (c) Microsoft Corporation. All rights reserved.\n",
      "// Licensed under the MIT License.\n",
      "namespace Microsoft.Quantum.Samples.Python {\n",
      "    open Microsoft.Quantum.Primitive;\n",
      "    open Microsoft.Quantum.Canon;\n",
      "\n",
      "    function HelloWorld (pauli : Pauli) : Unit {\n",
      "        Message($\"Hello, world! {pauli}\");\n",
      "    }\n",
      "\n",
      "    operation NoisyHadamardChannelImpl (depol : Double, target : Qubit) : Unit {\n",
      "        let idxAction = Random([1.0 - depol, depol]);\n",
      "\n",
      "        if (idxAction == 0) {\n",
      "            H(target);\n",
      "        }\n",
      "        else {\n",
      "            PrepareSingleQubitIdentity(target);\n",
      "        }\n",
      "    }\n",
      "\n",
      "    function NoisyHadamardChannel (depol : Double) : (Qubit => Unit) {\n",
      "        return NoisyHadamardChannelImpl(depol, _);\n",
      "    }\n",
      "\n",
      "}\n",
      "\n",
      "\n",
      "\n"
     ]
    }
   ],
   "source": [
    "with open('Quantum.qs') as f:\n",
    "    print(f.read())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can import this `HelloWorld` operation as though it was an ordinary Python function by using the Q# namespace as a Python module:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from Microsoft.Quantum.Samples.Python import HelloWorld"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Q# callable Microsoft.Quantum.Samples.Python.HelloWorld>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HelloWorld"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Once we've imported the new names, we can then ask our simulator to run each function and operation using the `simulate` method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, world! PauliZ\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "()"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "HelloWorld.simulate(pauli=qsharp.Pauli.Z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tomography ##"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `qsharp` interoperability package also comes with a `single_qubit_process_tomography` function which uses the QInfer library for Python to learn the channels corresponding to single-qubit Q# operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qsharp.tomography import single_qubit_process_tomography"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we import plotting support and the QuTiP library, since these will be helpful to us in manipulating the quantum objects returned by the quantum process tomography functionality that we call later."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import qutip as qt\n",
    "qt.settings.colorblind_safe = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To use this, we define a new operation that takes a preparation and a measurement, then returns the result of performing that tomographic measurement on the noisy Hadamard operation that we defined in `Quantum.qs`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "experiment = qsharp.compile(\"\"\"\n",
    "open Microsoft.Quantum.Samples.Python;\n",
    "\n",
    "operation Experiment(prep : Pauli, meas : Pauli) : Result {\n",
    "    return SingleQubitProcessTomographyMeasurement(prep, meas, NoisyHadamardChannel(0.1));\n",
    "}\n",
    "\"\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here, we ask for 10,000 measurements from the noisy Hadamard operation that we defined above."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing tomography model...\n",
      "Performing tomography...\n"
     ]
    }
   ],
   "source": [
    "estimation_results = single_qubit_process_tomography(experiment, n_measurements=10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To visualize the results, it's helpful to compare to the actual channel, which we can find exactly in QuTiP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "depolarizing_channel = sum(map(qt.to_super, [qt.qeye(2), qt.sigmax(), qt.sigmay(), qt.sigmaz()])) / 4.0\n",
    "actual_noisy_h = 0.1 * qt.to_choi(depolarizing_channel) + 0.9 * qt.to_choi(qt.hadamard_transform())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We then plot the estimated and actual channels as Hinton diagrams, showing how each acts on the Pauli operators $X$, $Y$ and $Z$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(None, <matplotlib.axes._subplots.AxesSubplot at 0x1dfe7176a20>)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dfe7118438>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (left, right) = plt.subplots(ncols=2, figsize=(12, 4))\n",
    "plt.sca(left)\n",
    "plt.xlabel('Estimated', fontsize='x-large')\n",
    "qt.visualization.hinton(estimation_results['est_channel'], ax=left)\n",
    "plt.sca(right)\n",
    "plt.xlabel('Actual', fontsize='x-large')\n",
    "qt.visualization.hinton(actual_noisy_h, ax=right)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also obtain a wealth of other information as well, such as the covariance matrix over each parameter of the resulting channel.\n",
    "This shows us which parameters we are least certain about, as well as how those parameters are correlated with each other."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]),\n",
       " <a list of 16 Text xticklabel objects>)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnEAAAJxCAYAAAAtjeQ4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3X+w5HV95/vnG8ZzcJhkZAw3JbkVDXohBcIMSiVekx0nBglqISJ7yaKURXSFEuPU6rWux1mzM7AyYoRY19m65BKE0RtFclmQrGgwxhCvla1rAZEfsVbMLiBVdxJ2JgO7ZvDMDL7vH/1t+E5P9zl9zunu7+d7+vmoOvX99vn+ep3ub3/7/f18P98+kZlIkiSpXY5pOoAkSZKWziJOkiSphSziJEmSWsgiTpIkqYUs4iRJklrIIk6SJKmFLOIkSZJayCJOkiSphdY0HUDSZEXECcD5wIXAKcBjwF3An2bmP0xLBh2tlNellBxS6cL/2CBNj4i4AzgBuJvOB+KjEfGLwAV0PjRnMnPLas/Qk+cE4G3A24FTgf/CFBYMpbwupeSosrhv9CjhOSkhQ0+Wxk44LOKkKRIRL8nMp5c7fbVkqG2rXjDclZk/bLKgbFIpr0tBOdw3epTwnJSQYUCWZk6KLeKk6dJz5tjkmXSjGaocL6HTN/h8Omf1R5xJA/OTKihLUNDr0ngO942jlfCclJChnqXpEw6LOGmK1M4cv0bnLLbJy6mNZeiTpfFLd00r5XUpMMfU7xtdJTwnJWToydPoCYdF3CpUQn+BEjL0ZGm8k3QJz0n9zDAijgGOyczD/aav5gzDbmuCl+7cNwrOsZzpY8jT+HGshOekhAy1bTV+wmERt8qU0F+ghAwDspTSWbvx/jUR8QFgB3AQ2At8NjM/N6ntl5KhJ89RBcOEtuu+UXCOKksj+0Zt+0Ucx3oyNfqclJChhBMOi7hVpoT+AiVkqGcp4aytpOekyvMY8D9n5t9HxMuAncATmbljmjLUsvwusJ0XCoZdmXnThLbtvlF2jsb2jVqGIo5jte2V8Jw0nqGWpbETDou4VaaEM7YSMvTkKaGTdGnPycPAxsz8afX4GOB7mXnmNGWoZWmsYHDfKD5HKcVk48exWpbGn5MSMpSQxSJuhOyzUE6G2rYa77NQ5SjmOam2dyXwm8BHM/PvIuIVwJcz83XTlKGWpbGCwX2j+ByNF5OlHMdqeUp4ThrPUEIWi7gRKe1suspkn4UC+iz0ydT461LluAj4IHAm8LPAF4Gv0jn4/HBaMlQ5SikY3DcKy1HCvlHacayQ56TxDCVksYgbkQLPphvvL1BChlqWIjpJl/Sc1DKtAU4DzgI20TmjfOMUZmi0YHDfKDdH0/tGLUcRx7EqS+PPSQkZms5iETdC9lkoL0NpWZrOUbUOD+PpzPxvqzXDQpoqGNw3ysrRTwHFZBHHsZ5MjRf6JWRoKotF3IjYZ6HMDKVlaTpHRPwlkEAsMFsCuzPzC6s1Qy1LMQWD+0ZxOYrZN7oK2Ecaf05KyFBSljXjWOmUek+9z0JErMnMHwG7gF3R+RqBSboB+L8j4qOZ+XfALwIHpjBDaVkazZGZvzGpbZWcoebzDFkwAGMtKHHfAMrJQVn7RlfTx7ESnpMSMhSTxZa4EbPPQnkZSstSSo5anmMz87lJb7cnw2xmzjeZoQTuGwNzuH9UCtxH1hRwI85xmfmTJjM0xSJuxOyzUG6G0rIUlONzwAcz80BEbM7MbzeU4cuZ+eeT3nafLF8ALs/MnzRx93KVwX3j6ByN7x8l7Bu1LKXsIzfR2Uee9fgx+X3EIm7E7LNQRobSspSSo5+I+AXgOuAwnX31+kluv5bjvcBG4OrM3NtEhirHH9N5Lt4PfCwz/82Yt+e+MVyWxvePSe8bte2Wvo9cDxzC48fE9xH7xI2efRbKyFBallJy9PNvgR8AJwN/MuFtAxARvwX8EvBK4KaI+Hxm3tlEFjpf0v05Ou/lfRPYnvvGIgraPya9b3SVvo/8Jzx+dE12H8lMf0b8A1wE3Av8I52K/PPA/wL8Tw3lWVPAc3Jc0xn8OeL12F4b/7lqeDxwU0MZLgNOrj3e1eDz8YvV8BXA3zb9Wk3jvlHS/uG+sejz09g+UsL+0SfLRPcRL6eOkX0WjsgwtX0Whsjz7zPzoglv86fAp4ENwAN0Xpv9k+zIPihDNe1nc4KXhRbK0qRp3TcWylFNm9j+Ueq+0aSI2J6ZV/X5/SSPH30zVNMmffwYmGXcvJw6Igv0WXga+MvqZ+I7V2U7cEtEHAK+B0y8iMvM90bEeyPiszTcZwE4BvjDiHg/8GFg7P1aIuL1gyYBrx739vtI4CfAPcBrgL+OiH+RmQ82nOGSzPxeA++Rxp4P940l5Whi/yjl+eiriUIf2B4Ra+kpbCdZ5A/KANDEZ+ygLONmS9yIlPIFlf1ExM3Aj+j0WfjXmfnkJLdfZfgt4J/RaZU8BDTWZyEi/i2dPgs7gH2Z+b9OYJuPAv+y3yTgjzLzlHFn6Mnzt5l5eu3xKcAfTrKluIQMJWRx3zDHEBkWKvRvzsxTJ5WlyvMc8AngYTqF7YXARAvbEjKUkMWWuBHJcr6gsp//LTP3RsTxwP9O/w+McXsZnYPNfwGIiF1AUx1P/ygzfxQRO4C7gbEXcXT6i/w6/Yv84yew/V57I+K1mXk/QHb+w8iJU5ihhCzuG+ZYzG4GF/oLNRyMy3/KzO3V+O0RsRv4Q2CSBXYJGRrPYhG3StWv0XcvXWbmP0XEFQ1l2N0z+V9PKkefLD+qho8Dpy+03AjdD3wy+zR9R8Q/n1CGuq3AlyPifjpnj2fSuatq2jKUkMV9wxyLsdAvM0PjWbycOgEldU6etgylZKkuhzycmf+9z7TfzMy/mFSW2nZngXPo9LvaB9yamf80bRmazuK+YY4htv+nwAUDCv2/ycyzJpWl2uZG4Mt0TkC6he3PZObbpilDCVks4kbEPgtlZigxiyQthYV+uRmazmIRNyJ2Ti4zQ4lZJEkaBfvEjY59FsrMUGIWSZJWzCJudOycXGaG4rJExD+j8z/+ngC+NuHvVioqRwkZSspSQgZzlJujpCwl5CghQ9NZjpnERqbEtcC6AdM+MskgAFVfr03ArdWv/hK4ZNoylJQlIo6JiC8D59MpIE8BvjnpFsEScpSQoaQsJWQwR7k5SspSQo4SMpSSxSJuRDLzr/t1Oq2mTbzTabXd+cy8OzM/lZk3NdHhs4QMBWX5XTqtgJuA/5dOa+AdwGemMEcJGUrKUkIGc5Sbo6QsJeQoIUMRWSzipMk5F/h3wE3Afwb2Z+YuOv9JY9pylJChpCwlZDBHuTlKylJCjhIyFJHFPnFjUMp1+hJylJChoCz7gZ8H3gH8GfDrEfHzE85QSo4SMpSUpYQM5ig3R0lZSshRQoYistgSN0JNXxsvKUcJGQrMciOwC/jLzPxt4OPAdcDtU5ijhAwlZSkhgznKzVFSlhJylJChiCx+T9wIRcRW4GeANwDvBK4H7gN+NTMvnaYcJWQoNMuFwL8C/gH4H4CvZ+anJpmhlBwlZCgpSwkZzFFujpKylJCjhAwlZLGIG6GI+CrwLuC3gD8CbsnMfxURf52Zg/6jw6rMUUKGErPUMv1sZv63JrZdWo4SMnSVkKWEDOYoNweUk6WEHCVk6Goii5dTR6uU6/Ql5CghQ4lZACjloFNCjhIydJWQpYQMYI5epeSAcrKUkKOEDF1NZLGIG61SrtOXkKOEDCVmeV5EHNvk9rtKyFFChq4SskTn/zA2zhxHKiWH1GURN0KZ+f8Afwi8MyL+BJgDHsnMP5i2HCVkKDFLjxsjYi1ARGye8hwlZCgpy/8REW9qaNt15jhSKTmIiC9ExIur8ZdMc44SMjSVxT5xY1LKdfoScpSQoauwLL9Ap0XwMPC9zLx+WnOUkKG0LBHxXjpfiXN1Zu5tIoM5is7xx3T20fcDH8vMfzOtOUrI0FQWW+LGpJRCoYQcJWToKikL8G+BHwAJ/MmU5yghQzFZIuK3gF8CXgncVN39Zg5z1D0G7ABuAI6f8hwlZOiabJbM9Mcffyb0A2yvjf9cNTweuGnacpSQoaQsPRkuA06uPd5ljunO0SfLL1bDVwB/O205SshQQhYvp05ARPz7zLzIHGVk6GoiS0T8FPg0sAF4APhyZu6PiGNzgv9BooQcJWQoKcugDNW0iXUDMEeZORbLMkkl5CghQwlZ/LdbIxIRg75vLIBXT1OOEjKUmKWSwE+Ae4DXAH8dEf8iMx+cwhwlZCgpS78Ml2Tm9yZZKJij2ByDsnj8mOLjhy1xIxIRjwL/st8k4I8y85RpyVFChhKzVHn+NjNPrz0+BfjDzHzjtOUoIUNJWUrIYI5yc5SUpYQcJWQoIYstcaNzPPDrdIqDftOmKUcJGUrMArA3Il6bmfcDZOaj0cD/ky0kRwkZSspSQgZzlJujpCwl5CghQ+NZbIkbkYj4U+CC7POERsTfZOZZ05KjhAwlZqm2uRH4MnA/8DBwJvAzmfm2actRQoaSspSQwRzl5igpSwk5SshQQhaLuBGp+l49nJn/vc+038zMv5iWHCVkKDFLbbuzwDl0+uTtA27NzH+axhwlZCgpSwkZzFFujpKylJCjhAxNZ7GIG5GIOCYzf7rc6aspRwkZSstijrIylJSlhAzmKDdHSVlKyFFChpKy+GW/o/PnEXFbRFwSET8LEBFrI+IdEfF/0WlmnZYcJWQoLYs5yspQUpYSMpij3BwlZSkhRwkZisliS9yIROefZp8KXAC8BZgBfkrnluO7gAcndKbUeI4SMpSWxRxlZSgpSwkZzFFujpKylJCjhAwlZbGIG5GI+AtgL/AV4G7gIHAscB7wduDVE7qpoPEcJWQoLYs5yspQUpYSMpij3BwlZSkhRwkZSspiETdCEXEaL1TkL6LzBYD3AH+amQ9MU44SMpSWxRxlZSgpSwkZzFFujpKylJCjhAylZLGIG5OIOC4zf2KOMjJ0lZLFHGVl6CohSwkZzFFuDignSwk5SsjQ1UQWizhJkqQW8u5USZKkFrKIkyRJaiGLOEmSpBayiBuziLi86Qxgjl7mOJI5jmSOI5njSOY4kjmONMkcFnHjV8ROhTl6meNI5jiSOY5kjiOZ40jmOJJFnCRJkgbzK0YWsHbt2nzJS16yonUcOHCAtWvXjiiROcxhDnOYo2nmMMe4c+zZs2dvZp642HxrVrSVVe4lL3kJV1xxRdMxJEnSFNmxY8cTw8zn5VRJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWqhkRZxEfGtiFhTG/5aRPyHiPj/IuLvIuLXl7neBdcTEfdGxCsWWP6EiLizd1ySJKmt1oxqRRFxOrAPOBXYl5mHI+IR4O3Ax4DvLLDsZuByYAPwDWBXZj5Xm2Wo9QySmfsjYkNEvDQz99XHl7ouSZKkEoyyJe4C4Cu1IZn5TE8xdpSIuBD4OPAJ4F3AOuBL9XmGWU/POq+MiEci4omI+GD167uB8/uMS5Iktc4oi7i30CmOusNhfQi4E7gKOBfYAjwZEW9YToiIuAh4E3AW8Dpge0SsAe6i05pHz3jv8pdHxH0Rcd+BAweWE0GSJGnsRlLERcSLgRlgHpjJzKeHXG498FRm3gAEcBPwTuBeYOMy42wFPpqZhzJzD3AIOCYzf0DnUi/18V6ZeWNmnp2ZZ69du3aZESRJksZrJEVcZj4LJHAskBGxbsjlngFOjIg3A68CbgGuA34ZeGKpOSLiRcCZmflo9fhlwN7MPBgRLwceq37//LgkSVIbjfJy6j3AebXhsL4OXAq8NTO3AvfR6a/2tWVkOA1YHxEnR8QxwCeBXdW0C+hcRu0dlyRJap1RFnHdfmbP9zeLiHMi4nvAB+hcKr2lz9d7fAp4ALgjIv4jnX5sF2fmoe4MQ64HOv3gvgjcCjwE/Cgzb6ymnQ/8aZ9xSZKk1hnZV4xk5v0RcQbwIHBGRKzJzG8CmxZZLoHrq59B8yy6nsom4KuZeVv9lxFxAjCbmXvq40OsT5IkqUgj/bLfzNyYmYe7w1Gue0ibgO/1ybU/Mzf3jkuSJLXVyFriGrYbeDoztzScQ5IkaSJWRRGXmbubziBJkjRJI72cKkmSpMmwiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFlrTdABJk7Fz504OHjy4rGVnZmbYtm3biBM1ZyXPBay+50NayNzcHLOzs8tefn5+nmuvvXaEidRlEbfKLOfN5htsOqykaFnJsiVa6d+z2p4PaSErKeBGsbwG83LqKrOcN4tvMEmS2seWOElSkRa7sjCJqwjDXt3wisb0anI/tYiTJBVpseJpElcRht2GVzSaMah/6yT7rTa5n66oiIuIbwHnAt+ohr8KzAGvBQ4Al2Xmd1Yacogc91bbenyBeU4AbgbeA9ycmReOO5c6Bp2lTPrMtYQ3u47m6yJpuQb1T52WfqvLLuIi4nRgH3AqsC8zD0fEI8DbgY8BA4u3iNgMXA5soFMA7srM55abZRiZuT8iNtDpB7ghIl6amfvGuU11DDoLmfSZa0lv9t7CdpovxZT0upSit7C1oFWd+4e6VnJjwwXAV2pDMvOZxYqxiLgQ+DjwCeBdwDrgS33m2xgR346I70fETyMiI+KqYYJFxJUR8UhEPBERH6xNuhs4vzaUGtFbwHopRnW9BWyTBe3c3Bzbt29nbm6usQw6Ukn7h5q1kiLuLXSKoe5wWB8C7gSuonMJdgvwZES8oTtDRBwH3AZ8JDNPA64BrgN2LLbyiLgIeBNwFvA6YHtEdFsc76LTUtgd9lv+8oi4LyLuO3DgwBL+LElafbonGJ5oSOVZVhEXES8GZoB5YCYznx5yufXAU5l5AxDATcA7gXuBjbVZzwEeyMzvVo8fAjZkZg6xma3ARzPzUGbuAQ5R/Z2Z+QPg1O6w38KZeWNmnp2ZZ69du3aYP0uSRmpmZmbBx5M0Pz9/xFDNK2n/ULOW1ScuM5+NiASOBTIi1mXmj4dY7pmIODEi3gy8CriFTgvbQ8APa7O+Gni49vg1wAMAEXEi8PvA7wFXA1d0Z4qIFwFnZuaj1eOXAXsz82D1+OXAY93hcv52tdfMzMzADvSTNj8/f1SfuGlV0utSipL6N01rX82SlbR/qFkruTv1HuC82vD2IZf7OnAp8NbM3BMRW4GL6LS+de0D3ggQEacA7wBeD5CZ/zUifgRcD7w3Mw9FRHe504D1EXEy8DjwSWBXbb0X0LmU2h1qAnoLlvrvJ6mkA58fjC8o6XWR1C7TfhK4kiLuLjr92z5TDW+PiHPotKz9PHAZnVa6R3q+zuNTwIeBO6ri6zHg4sw8VJvnVuBt1d2ue4FLuneSRsQ64GTgcJ/Wv7OAL1bLHw/ckZk31qafD7wb+EI11ARYsEhajkEngPXpTWeYZBYdrYSTwCb302UXcZl5f0ScATwInBERazLzm8CmRZZLOq1o1y8wz4/pc/dodYPCZ+nc3XpxRGzJzHtrs2wCvpqZt/VZ9gRgFvgJMFv1l5MkFaqEE8ASMqhsTe4jK/qy38zs3oywccEZRyQzD9P5sl6AT/eZZRNww4Bl9wObq4eb+82zGgx71ti7jCRJapfV8m+3dgNPZ+aWhnM0zrNGDTKo78iwy0qaTstpHOhdXuOxKoq4zNzddAapdCX0HSnFSgra7vLStLBxoFyrooiTpKWwoJW0GqzkPzZIkiSpIRZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EJrmg6g1WVubo7Z2dkVrWN+fp5rr712RIkkLWQU71nwfavx2rlzJwcPHlzROmZmZti2bduK1lHa+8UiTiM1ip17FOuQNJxRvd9GsZ6VfEBaRK5uKy3gRrWOkt4vYBEnSSrESj7YPPkbr+UW2BbX42URJ0nSAMNexhvFpbqSLbdItrgeL4s4acr4oXS0xZ6TaXoudKRhL8GN4lKdtFQWcZoKfki/wA+loy32t07TcyGpPVZUxEXEt4BzgW9Uw18F5oDXAgeAyzLzOysNOUSOe6ttPb7APCcANwPvAW7OzAvHnatpg/owTGMfBT+ky+V+KknLs+wiLiJOB/YBpwL7MvNwRDwCvB34GDCweIuIzcDlwAY6BeCuzHxuuVmGkZn7I2IDne/G2xARL83MfePcZtMG9UWwj0LzeguXaS5Y3E+P1ttyPE0txVpcff9w35huK/my3wuAr9SGZOYzixVjEXEh8HHgE8C7gHXAl/rMtzEivh0R34+In0ZERsRVwwSLiCsj4pGIeCIiPlibdDdwfm0oNaK3QJnmgkVH620ZtqVYdfX9wX1juq2kiHsLnWKoOxzWh4A7gavoXILdAjwZEW/ozhARxwG3AR/JzNOAa4DrgB2LrTwiLgLeBJwFvA7YHhHdFse76LQUdof9lr88Iu6LiPsOHDiwhD9LkiRpcpZVxEXEi4EZYB6Yycynh1xuPfBUZt4ABHAT8E7gXmBjbdZzgAcy87vV44eADZmZQ2xmK/DRzDyUmXuAQ1R/Z2b+ADi1O+y3cGbemJlnZ+bZa9euHebPkiRpYmZmZvqOa/osq09cZj4bEQkcC2RErMvMHw+x3DMRcWJEvBl4FXALnRa2h4Af1mZ9NfBw7fFrgAcAIuJ3gL8H/gz4HPCB7kwR8SLgzMx8tHr8MmBvZh6sHr8ceKw7XM7f3ibz8/MDO4yrWb2vja+J6mZmZo7qEyd12QdOXSu5O/Ue4Lza8PYhl/s6cCnw1szcExFbgYvotL517QPeCBARpwDvAF5fTfs2nTtMfwG4rSoou8udBqyPiJOBx4FPArtq672AzqXU7nBVm9aO8v30fij2mz5JvjYv8GTjaH5ISxrGSoq4u+j0b/tMNbw9Is6h07L288BldFrpHun5Oo9PAR8G7qiKr8eAizPzUG2eW4G3VXe77gUu6d5Jmpn/OSLOAtZn5k09mc4CvlgtfzxwR2beWJt+PvBu4AvVUFPCD8VylVDQllbkS9Iwll3EZeb9EXEG8CBwRkSsycxvApsWWS6B66ufQfP8mIXvHj0MXN3n95uAr2bmbb0Tqu+JmwV+AsxW/eWkqbNYwVKfb1pY5GsQ3y8q2Yq+7DczuzcjbFxwxhGpboy4Bvh8Zj7VZ5ZNwA39ls3M/cDm6uHmfvNI08CCRRqe7xeVrFX/disznwF+t8+k3cDTmbllooEkSSMzqH/ksMtqfJb72vi6jFerirhBMnN30xnUsZKDcH0dkiZjFO/Z7npWqoT+keqv6ddm2Mvai61jpUp6vwDEcF+9Np1OOumkvOKKK5qOIUmSpsiOHTvuz8yzF5tvJf+xQZIkSQ2xiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBZa03QASWrS3Nwcs7Ozi843Pz/PtddeO4FEktpi586dHDx4cNH5ZmZm2LZt28i3bxGnsVpsBx/Xjt1rsQ/qafuA9vl4wTAF3FLmkzQ9hingljLfUq2oiIuIbwHnAt+ohr8KzAGvBQ4Al2Xmd1Yacogc91bbenzA9BOAmzPzwvr4uHM1bVABNanCCRbfcce1Y/da7AN42j6gfT40jN5jyCSPHaUZdOIzTSc8JZr212XZRVxEnA7sA04F9mXm4Yh4BHg78DFgYPEWEZuBy4ENdArAXZn53HKzLCYz90fEhoh4aWbuq4+Pa5slGFQgTapw0sK6H5DT/MHY1XsgnpYDcOl6jxVNHTtK2D8GndhM8wlPCUX+tL8uK2mJuwD4Sm1IZj4DEBEDF4qIC4H3A1uBfwA+AHwJ+O2e+TYCu4CfA34ZCODqzNy+WLCIuBK4EvgZ4LrM3AXcDZwP7O4ZlxrRPfhZVB99wJ2WA/BCLPJf4P5xtBL2j1KK/Gm2krtT30KnGOoOh/Uh4E7gKjqXYLcAT0bEG7ozRMRxwG3ARzLzNOAa4Dpgx2Irj4iLgDcBZwGvA7ZHxBrgLjqthPSM9y5/eUTcFxH3HThwYAl/liSNjkW+pMUsqyUuIl4MzADzwExmPj3kcuuBpzLzhoj4DeAm4JXArwAbgb+qZj0HeCAzv1s9fgg4LzNziM1sBd6XmYeAPRFxCDgmM38QEacC1Md7ZeaNwI0AJ5100jDbk5ZlZmbm+TNpqZf7xwvm5+ePupw67Upone3uo/XHmqxlFXGZ+WxEJHAskBGxLjN/PMRyz0TEiRHxZuBVwC10WtgeAn5Ym/XVwMO1x68BHgCIiJcD7wN+qbPKvLQ7U0S8CDgzMx+tHr8M2JuZB6vlHqut47Hl/O1t0vsGq/9ezSvhIFwKP6SPVsL+UcqHdAn9I3v30frvp1UJ++i0W0mfuHuA82rD24dc7uvApcBbM3NPRGwFLqLT+ta1D3gjQEScArwDeD1AZj4REZ+jczn2/T3rPg1YHxEnA48Dn6TTrw46fffu6jO+apXwBhtUSNanSyV8SOtoJRxDSuE+WqZpL65XUsTdRad/22eq4e0RcQ6dlrWfBy6j00r3SM/XeXwK+DBwR3UDxGPAxdXlz65bgbdVd7vuBS7p3kkaEa+g0zfu/Zn5Tz2ZzgK+WC1/PHBHdXkUOjcyvLvPuMaolA+BQW/0+vRp4vMhaTWY9uJ62UVcZt4fEWcADwJnRMSazPwmsGmR5RK4vvoZNM+P6RRa/XyNTuvfxyLiDzLzH2vTNgFfzczb6gtU3w03W7X8PT++yJ+oVWTa3+i9fD5esFhBW59PkuoWu9pUn28cVvRlv5m5sRqYhTQHAAAgAElEQVTduOCMI1TdrTrIJuCGPsvsBzb3jkuSBa2k5Wr6atNq+bdbu4GnM3NLwzkkSZImYlUUcZm5u+kMkiRJk7SSL/uVJElSQyziJEmSWsgiTpIkqYUs4iRJklrIIk6SJKmFLOIkSZJayCJOkiSphSziJEmSWsgiTpIkqYUs4iRJklrIIk6SJKmFLOIkSZJayCJOkiSphSziJEmSWsgiTpIkqYUs4iRJklrIIk6SJKmFLOIkSZJayCJOkiSphSziJEmSWsgiTpIkqYXWNB1AUjN27tzJwYMH+06bmZlh27ZtE07UrEHPxzQ+F9Ji5ubmmJ2dPer38/PzXHvttQ0kmk4rKuIi4lvAucA3gHMz8/BIUvXf1q8Bc8BrgQPAZZn5nWravdXjxxdY/gTgZuA9wM2ZeeG4supovW943+jNG1TALTZtHHoLqCYKp0F/86SfCx3JYqFM/V6ThX6/2jW1ny67iIuI04F9wKnAvpUUcBGxGbgc2ECnINyVmc/1zPYI8HbgY8B3lrqNzNwfERvoXELeEBEvzcx9y83cFqUUT707d5Nv9G7B0HQLS/e18cPo6ELJwqkMJRw/SioWSng+dLQSTgKb2k9X0hJ3AfCV2hCAiNgI7AJ+DvhlIICrM3N7v5VExIXA+4GtwD8AHwC+BPx2fb7MfKaaf9FgEXElcCXwM8B1mbmrmnQ3cH5tuHuYP7TNSiqeStF9szddKHRfC18T9VPCyYbHjyOV9HyUsH+UYppPAldyY8Nb6BRD3SERcRxwG/CRzDwNuAa4DtixwHo+BNwJXEXn0uwW4MmIeMNyQkXERcCbgLOA1wHbI6JbrN5FpzWvO+y3/OURcV9E3HfgwIHlRJAkSRq7ZbXERcSLgRlgHpjJzKerSecAD2Tmd6vHDwHnZWYOWM964KnMvCEifgO4CXgl8CvARuCvlhFvK/C+zDwE7ImIQ1TFamb+ICJO7Q77LZyZNwI3Apx00kl9c6vdZmZmnj+DbdL8/Pzzl1OlXtPeulKi7nu2/rgp7h+CZRZxmflsRCRwLJARsS4zfwy8Gni4NutrgAci4kTg94HfA64GrsjMQ5n5TEScGBFvBl4F3EKn5e4h4IdLzRURLwLOzMxHq8cvA/Zm5sHq8cuBx7rD5fztbVPKQaeUHFDOwc++NC/oFtb1x2peCe/b3gxNZvE9W6YSjh9N7acr6RN3D3BebXg7nRsd3ggQEacA7wBen5n7IuJHwPXAe6tWsq6vA5cCb83MPRGxFbiITqveUp0GrI+Ik4HHgU/S6Z/XdQGdS6nd4apXykGnlBx6Qe+Br3faJJVQWA96Pqa5oCzhfVtCBh2tpOK6hONHU/tpDLjSufiCEa+l05/tM8CHMvPSiFgH3Ar8ErAX+HBmPlD9/gbgmMx8V896Avgw8M+rXz1Wre8feuY7h04r3c8D/wQk8EhmXtj9ihE6/el+EzgFOB64IzP/TW0dfw68G/gC8O7M3LPQ33jSSSflFVdcsZSnRZIkaUV27Nhxf2aevdh8y26Jy8z7I+IM4EHgjIhYU11SPb8+X3VTwWeBjwMXR8SWzLy3tp6k00J3/SLb+yawaZFYm4CvZuZtvROq74mbBX4CzC5WwEmSJJVsRV/2m5kbq9GNC8xzmM4X7AJ8eiXbG8ImOi1+/XLsBzZXDzf3m0eSJKktVsu/3doNPJ2ZWxrOIUmSNBGroojLzN1NZ5AkSZqklXzZryRJkhpiESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLbQq/neqpBfMzc0xOzs7kW3Nz89z7bXXTmRbkqQj2RInrTKTKuAmvS1J0pFsiZM0FcbVQmlrpFabnTt3cvDgwbGtf2Zmhm3bto1t/dPEljhJU2FcrYa2Rmq1GWcBN4n1TxNb4iRJkhYx6hbKUbRIWsRJkho3qg9IL9VpXEbdgjiK9VnErSIrOQh64NOkLLdvmn3PVrdRfUCOYj0rLSg9nmpSLOJWkZUcdOyjoElZbh8y+55pUlZ6PPR4Oj6eBB7JGxskSVIreBJ4JFviNDbDXpLw0oMkSUtnEaexGfaSwiQuPSzWBD/JpvaFilsLWpVgsRMw91OpDEMXcRHxLeBc4BvAuZl5eGypligi7gUuy8zHB0w/Abg5My+sj08wohq2WFP6JJvaF/pwtC+NBp1wTPJEY7H90P20OSXsHyrHUH3iIuJ0YB9wKrBvJQVcRGyOiD+OiK9FxL+KiGOXu65hZeZ+YENEvLQ+Pu7tStJSDTqhWK19erQ07h+qG/bGhguAr9SGAETExoj4dkR8PyJ+GhEZEVcNWklEXAh8HPgE8C5gHfClAfMuad09y14ZEY9ExBMR8cHq13cD5/cZlyRJap1hi7i30Cl8ukMi4jjgNuAjmXkacA1wHbBjgfV8CLgTuIrOpdktwJMR8Yb6TMtcd3fZi4A3AWcBrwO2R8Qa4C7g7dVs9fHe5S+PiPsi4r4DBw4stjlJkqRGLFrERcSLgRlgHpjJzKerSecAD2Tmd6vHDwEbMjMHrGc98FRm3gAEcBPwTuBeYGPP7Etad4+twEcz81Bm7gEOAcdk5g/oXA6mPt4rM2/MzLMz8+y1a9cOsTlJkqTJW7SIy8xngQSOBTIi1lWTXg08XJv1NcADEXFiRNwSEf9jRNwcES+q1vMMcGJEvBl4FXALnda1Xwae6NnsktbdVT0+MzMfrR6/DNibmQcj4uXAY9Xvnx+XpJLMz88v6feaLu4fqhv27tR7gPNqw9vp3OjwRoCIOAV4B/D6zNwXET8Crgfem5mHauv5OnAp8NbM3BMRW4GL6LS81S1n3QCnAesj4mTgceCTwK5q2gV0LqP2jmsKzM/PL/oVI5MyMzOz4FeMaLqVcIfhQvtod7qaUcL+oXIMW8TdRac/22eq4e3ArcDbIuIRYC9wSVVkrQNOBg5n5o971vMp4MPAHREBndawi/sUY8tZN3T6wX2xWv544I7MvLGadj7w7j7jmgIlHfj8fi2Vzn1UaoehirjMvD8izgAeBM6IiDVVEXXEHZ7VDQSfpXMH6sURsSUz762tJ+m0ol2/yPaWvO7KJuCrmXlbz7InALNV69/z48P87Vq+xc7m6/NJkqSlGfrLfjOze/NB700I9XkOA++pHn56BbmWu+5NwA19lt0PbO4d13h5Ni9JGqXFusYstNxqtFr+7dZu4OnM3NJwjkYN2/I1aFlpEjwIq3QrOZZ2l9d4lNQ1pgSroojLzN1NZyiBLV9qAw/C6melhVN9PSvlsVRtsSqKOElSu1k4qXSjOtGor2+lLOIkSZIWUeKJxrD/dkuSWm1cfersq6fVZtx9+uwzODq2xEmaCvbFk4ZTYouT+rMlTlplJtkyZCuUJDXHljhplbHFSZKmgy1xkiRJLWQRJ0mS1EIWcZIkSS1kESdJktRCFnGSJEktZBEnSZLUQhZxkiRJLWQRJ0mS1EIWcZIkSS3kf2yQNBFzc3PMzs6ueD3z8/P+VwqNzc6dOzl48OCK1zMzM+P/INXY2RInaSJGUcCNcj1SP6Mo4Ea5HmkhtsRJU2K5LWG2fElSmWyJk6bEcluwbPmSpDLZEidJkrQMw/ahHFcfSYs4SZI0lKaLltIM2/dxXH0kLeIkicF9BqexT+BiH9ST+oAuJYde0HTRUrdQP99ped8OXcRFxLeAc4FvAOdm5uGxpVqiiLgXuCwzHx8w/QTg5sy8sD4+wYiNGHQAnPSBzw/Ho/W+Nn4YNW/Qh8E09glc7AN4UndelpJDZVrovTkt79uhiriIOB3YB5wK7FtJARcRm4HLgQ10CsJdmfncctc3jMzcHxEbIuKlmbmvPj7O7TZt0AFu0ge+kj4cewvKpgrJ3tfADyPVlbKfqkz1/cN9Y7oNe3fqBcBXakMAImJjRHw7Ir4fET+NiIyIqwatJCIuBD4OfAJ4F7AO+NKAeZe07p5lr4yIRyLiiYj4YPXru4Hz+4xrivQWjtNytqZ2cT/VQur7g/vGdBu2iHsLncKnOyQijgNuAz6SmacB1wDXATsWWM+HgDuBq+hcmt0CPBkRb6jPtMx1d5e9CHgTcBbwOmB7RKwB7gLeXs1WH+9d/vKIuC8i7jtw4MBim5MkSWrEokVcRLwYmAHmgZnMfLqadA7wQGZ+t3r8ELAhM3PAetYDT2XmDUAANwHvBO4FNvbMvqR199gKfDQzD2XmHuAQcExm/oDO5WDq470y88bMPDszz167du0Qm5Ok0Zqfn1/wsaZbfX9w35hui/aJy8xnIyKBY4GMiHWZ+WPg1cDDtVlfAzwQEScCvw/8HnA1cEVVUD0TESdGxJuBVwG30Gldewj4Yc9mB637d4C/B/4M+Bzwgcx8tjtTRLwIODMzH60evwzYm5kHI+LlwGPV758fX81mZmYG3tgwrebn54/qa9SE3tdmml8THc0+TlqI+4e6hr079R7gvNrwdjo3OrwRICJOAd4BvL66ceBHwPXAezPzUG09XwcuBd6amXsiYitwEZ2Wt7q+6wZeArwH+AXgtnoBVzkNWB8RJwOPA58EdlXTLqBzGbV3fNUq5W7H3sKp/vtJK+XgV8proxeUtJ82bdAJYH36NOVQmQa9Z7vTpsGwRdxddPqzfaYa3g7cCrwtIh4B9gKXVAXcOuBk4HDVYlf3KeDDwB0RAZ3WsIt7Cj0GrRvYFxFnAesz86Y+Oc8CvlgtfzxwR2beWE07H3h3n3GNWSmFk7QQ99MXlHKSUUoOvWCxwro+37j5nh2yiMvM+yPiDOBB4IyIWFMVaEfc4VndQPBZOnegXhwRWzLz3tp6kk4L3fWLbO+oddccpnOZtp9NwFcz87aeXCcAs1Xr3/PjC2WQJElHsrA+UtNF7dBf9puZ3ZsPem9CqM9zmM7lToBPryDXUaobI64BPp+ZTw2YbRNwQ59c+4HNveOSJEnL1XRR25p/u5WZzwC/O2DybuDpzNwysUBSyyzUf2Sx5SRJ5WlNEbeQzNzddAapdPYfkaTVZdgv+5WkFRlVi54tgxqnUfVd8s5ZTcKqaImTVD5bAtUGTfdxkpbCljhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIYs4SZKkFvI/Nkha1ebm5pidnZ3Itubn5/3PFJImxpY4SavapAq4SW9LkmyJk1apcbVA2dokSWWwJU5apcbVKmRrkySVwZY4SZJ0lJ07d3Lw4MGRrGtmZoZt27aNZF1NKfH5sCVOkiQdZVQFy6jX1ZQSnw9b4laJlZ4hrIazJEmSpolF3Cqx0qp+NZwlSWq/5Z6QeiKqaWQRp1Vv2Ls0vetSat5yTyg9EdU0sojTWA1zVj3uM+hh76b0rkvJk55+FntOpum5UFks4jRWw5wdT9sZ9EKF7TReEhr0AekHYzM86TnaYn/rND0XJbG4XuLdqRHxrYhY0x2OK9RSRcS9EfGKReY5ISLu7A4nk0w62kJF67QVtDD4A9APRkkLsbheQktcRJwO7ANOBfZl5uHlbjQiNgOXAxuAbwC7MvO55a5vGJm5PyI20ClcN0TESzNz3zi3KUnLVW9lmIYWBUlLt5SWuAuAr9SGAETExoj4dkR8PyJ+GhEZEVcNWklEXAh8HPgE8C5gHfClAfMuad215a6MiEci4omI+GBt0t3A+bWhJBWp3oowDS0KWpq5uTm2b9/O3Nxc01HUoKUUcW+hU/x0h0TEccBtwEcy8zTgGuA6YMcC6/kQcCdwFXAusAV4MiLeUJ9pmesmIi4C3gScBbwO2F679HsX8PbasN/yl0fEfRFx34EDBxbalCRJUmOGupwaES8GZoB5YCYzn64mnQM8kJnfrR4/BJyXmTlgPeuBpzLzhoj4DeAm4JXArwAbgb+qzb6kdddsBd6XmYeAPRFxiKpYzcwfRMSp3WG/hTPzRuBGgJNOOmmxbUnSWMzPzx9xOVWq8/K6YMgiLjOfjYgEjgUyItZl5o+BVwMP12Z9DfBARJwI/D7we8DVwBWZeSgzn4mIEyPizcCrgFvotK49BPywZ7OD1v1y4H3AL3Wi5aXdGSLiRcCZmflo9fhlwN7MPFg9fjnwWHc4zN8uSU3wQ1rSYpZyOfUe4LzaEDo3OpwJEBGnAO8AvpyZ/xX4EXA9sLVqFev6OnAp8NbM3ArcR6d/2td6tjdo3U8AnwOeA67oWeY0YH1EnBwRxwCfBHbVpl9A51JqdyhN3MzMzLKmrVaDWplsfZK0kMWOEdNwDFnK14TcRac/22eq4e3ArcDbIuIRYC9wSWbui4h1wMnA4arFru5TwIeBOyICOi1iF/cUeiyw7lfQ6Rf3/sz8p55lzgK+WC17PHBHdXm063zg3cAXqqHGbGZmZqgv+50m0/Y9cIuxxaks9cu4i803LRZ7TqbpuSiJx44lFHGZeX9EnAE8CJwREWuqAu2Iuzyrmwg+S+cO1IsjYktm3ltbT9Jpobt+ke0dte7K1+i0Bn4sIv4gM/+xNm0T8NXMvK13oYg4AZgFfgLMZuaexf5mrVwJBYsfStLw/GA8ms+JSrWkL+zNzI3V6MYF5jkMvKd6+Oll5loow2kLTN4E3DBguf3A5urh5n7zaHXyACy1xzCt94OWk6ZNMf91YYV2A09n5paGczRmuQe++vKS1LQSWu+ltlgVRVxm7m46Q9M88EmSNF2W9L9TJUnSdBjlFZrVcLWnxOdjVbTESZKk0fIKz5FKfD5siZNWqXHdbetdvJJUBlvipFXKu3IlaXWzJU7SqjbJlkNbKSVNki1xklY1WyQlrVa2xEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC61ZycIR8S3gXOAbwLmZeXgkqfpv69eAOeC1wAHgssz8TjXt3urx4wssfwJwM/Ae4ObMvHBcWXW0nTt3cvDgwecfz8zMsG3btgYTaW5ujtnZ2aN+Pz8/z7XXXttAIpWk9z0Lzbxv++UoJcs0H8dKeV36HceaOoY1sX8su4iLiNOBfcCpwL6VFHARsRm4HNhApyDclZnP9cz2CPB24GPAd5a6jczcHxEb6LQ+boiIl2bmvuVmbpP6jtXUQaf3zd7vza/J6lfALfT7ceo9EDdZSNazlJCjqQz93qNNvG8HbbOELNN8HCvldel3vGriGAbN7B8raYm7APhKbQhARGwEdgE/B/wyEMDVmbm930oi4kLg/cBW4B+ADwBfAn67Pl9mPlPNv2iwiLgSuBL4GeC6zNxVTbobOL823N1n2cvpFJSsX79+0W21QX1HmuaDTle3qG36LLqUHCXoPeg2dRDu3XYJOZrMoHI1XeSrDCvpE/cWOsVQd0hEHAfcBnwkM08DrgGuA3YssJ4PAXcCV9G5NLsFeDIi3rCcUBFxEfAm4CzgdcD2iOgWq3fRac3rDo+SmTdm5tmZefbatWuXE0GSJGnsltUSFxEvBmaAeWAmM5+uJp0DPJCZ360ePwScl5k5YD3rgacy84aI+A3gJuCVwK8AG4G/Wka8rcD7MvMQsCciDlEVq5n5g4g4tTtcxrpbaWZm5ojLqdOulFavUnKUYH5+/qjLqSVkKSFHkxlULlvfBMss4jLz2YhI4FggI2JdZv4YeDXwcG3W1wAPRMTvAH8P/BnwOeADmflsZj4TESdGxJuBVwG30Gm5ewj44VJzRcSLgDMz89Hq8cuAvZl5sHr8cuCx7nA5f3sblVAs1AvJ7mM1q7dwqv9+0kr6QColS9M5et+z3d+VkKOULNN8HCvldel3HGvqxKeJ/SMGNJItvmDE1XSKrTOBhzLz9oh4H/DGzLwkIk4B/gPweuAldO4KfQx4MjPvqa1nDjiDziXYPRGxFbgIOKdqTevd7sfp3NhwuPfuVGA98Dd0CsLH6dyN+teZeWM131Y6rYezwHxm/p8L/Y0nnXRSXnHFFct4diRJkpZnx44d92fm2YvNt5I+cf36l90KrIuIR4AbgUsyc19m/mc6fdQ21Qu4yqeAB4A7IuI/0unHdnFvARcR50TE9+jc+HATcEtE3NmzrrOAL1Y5HgJ+1C3gKucDf1obSpIktdKy707NzPsj4gzgQeCMiFhTXVI9f8Aih4Gr+6wngeurn4W2901g0yKxNgFfzczbeidU3xM3C/wEmM3MPYusS5IkqVgr+o8NmbkxMw93h/3miYj1EfHvgM9n5lMr2d4QNgHf6zchM/dn5ubucMw5JEmSxmpF/7FhGNX3u/3umDezG3g6M7eMeTuSJElFGHsRNwmZubvpDJIkSZO0osupkiRJaoZFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC1nESZIktZBFnCRJUgtZxEmSJLWQRZwkSVILWcRJkiS1kEWcJElSC61pOoAkaXLm5uaYnZ0d+3bm5+e59tprx74daZrZEidJU2QSBdwktyNNM4s4SZKkFvJyqiRJ0hBG1R1hVN0NLOI0UqPYwe1LI0nqtXPnTg4ePLjs5WdmZti2bduKMoyqm8Co1mMRp5EaxY5pXxppOq30JNATwNVtJQXcKJYvkUWcJKkIKz2B8wRwvJZaZFtUj583NkiSpEUttUi2qB4/W+IkTbVhWxdsVZBUGos4aQot1kF4FB2A25Jj2NYCWxUklWboIi4ivgWcC3wDODczD48t1RJFxL3AZZn5+IDpJwA3Z+aF9fEJRlQh+hUNkypYSrJYB99JdQAuJUdp3E/L1Pu6NPGauG+obqgiLiJOB/YBpwL7VlLARcRm4HJgA52CcFdmPrfc9Q0jM/dHxIaIeGlm7quPj3O7Kk+/oqCJQqH3Ep6X6lRXyn6qI/W+Bk28Ju4bqhv2xoYLgK/UhgBExMaI+HZEfD8ifhoRGRFXDVpJRFwIfBz4BPAuYB3wpQHzLmndPcteGRGPRMQTEfHB6td3A+f3Ge9d9vKIuC8i7jtw4MAwmyve3Nwc27dvZ25urukoqvRemvNSnSRpqYYt4t5Cp/DpDomI44DbgI9k5mnANcB1wI4F1vMh4E7gKjqXZrcAT0bEG+ozLXPd3WUvAt4EnAW8DtgeEWuAu4C3V7PVx4+QmTdm5tmZefbatWsX25wkSVIjFr2cGhEvBmaAeWAmM5+uJp0DPJCZ360ePwScl5k5YD3rgacy84aI+A3gJuCVwK8AG4G/qs2+pHX32Aq8LzMPAXsi4hBwTGb+ICJOBaiPTwMv05Vnfn7+qMupkiQtxaJFXGY+GxEJHAtkRKzLzB8DrwYers36GuCBiPgd4O+BPwM+B3wgM5/NzGci4sSIeDPwKuAWOq1rDwE/7NnsoHWfCPw+8HvA1cAVVbEGQES8CDgzMx+tHr8M2JuZByPi5cBj1e+fH9d0mZmZ6dspeNIsrLWQUvZTHan3dWniNXHfUN2wd6feA5xXG95O50aHNwJExCnAO4DXAy8B3gP8AnBbZj5bW8/XgUuBt2bmnojYClxEp+Wtru+6q5sSfgRcD7y3XsBVTgPWR8TJwOPAJ4Fd1bQL6FxG7R3XFPEOro5+HwS906cpR2ncT8tUwutSQgaVY9gi7i46/dk+Uw1vB24F3hYRjwB7gUuquz33RcRZwPrMvKlnPZ8CPgzcERHQaQ27uE8x1nfdEbEOOBk4XLUG9joL+GK1/PHAHZl5YzXtfODdfcalqVPKB0EJOXovbS80nySVZKgiLjPvj4gzgAeBMyJiTVVE9b3DEzhM53Jn73qSTiva9Yts76h1VzcnfJbO3a0XR8SWzLy3Z9FNwFcz87aeZU8AZqvWv+fHF8ogaTp4aVtSWw39Zb+ZubEa3ThonurmhWuAz2fmUyvM1rv9w3Qu0wJ8esBsm4Ab+iy7H9jcOy5JkoYzbKt1fX6N10j/7VZmPgP87ijXOaTdwNOZuaWBbUuSRmCpRUK/5TU+tlqXZ1X879TM3N10BnWs9CDcXYek6WORoIUsdiPUMMuv1Cg+47rrGYVVUcSpHB6EJUnjUMKNUKV9xg37HxskSZJUEIs4SZKkFrKIk6QpMqk+p/ZtlcbPPnGSNEVK69MjaflsiZMkSWohizhJkqQWsoiTJElqIYs4SZKkFrKIkyRJaiGLOEmSpBayiJMkSWohizhJkqQWsoiTJElqIf9jgySpMXNzc8zOzo50nfPz8/5nCk0FizhJUmNGXcCNa53TaJQF9koK6507d3Lw4MGR5ACYmZlh27ZtS15u1CccozjZsIiTVrlRHQCXe+CT1E6jLFhWsq5RFnArWd+oTw5GsT6LOI3cSs5WvAwyeqM6AI76QKpyrLSFwfet1AyLOI3cSj4MvAyiSVluC+VqbJFc6fvO963UDO9OlTSVltuyaIukpFLYErdKLXZ5xMsfkiS1m0XcKrXY5Q0vf6gEi13SXI2XLhcz6DmZxudC0sKGLuIi4lvAucA3gHMz8/DYUi1RRNwLXJaZjw+YfgJwc2ZeWB+fYETpeYNaSaexdXSxS5PTeOly0N88jc+F+ust9C3wp9dQRVxEnA7sA04F9q2kgIuIzcDlwAY6BeGuzHxuuesbRmbuj4gNEfHSzNxXHx/ndlWmehHVROE0qBXU1lGpfN0CqsnCqbegt8CfXsPe2HAB8JXaEICI2BgR346I70fETyMiI+KqQSuJiAuBjwOfAN4FrAO+NGDeJa27Z9krI+KRiHgiIj5Y/fpu4Pw+473LXh4R90XEfQcOHBhmc2qZerFk4SRpKboFk4WTSjBsEfcWOoVPd0hEHAfcBnwkM08DrgGuA3YssJ4PAXcCV9G5NLsFeDIi3lCfaZnr7i57EfAm4CzgdcD2iP+/vfuPmauuEz3+/kiZSu2mS13+QK5ihjsAABvsSURBVP8AkVBTKW25jTHcpFaCBDQVsAkbVmLUGzBFbaIx2UK84Uekwr2gye1NyG34UTcXSRMC4qIu5sag2VwTAr1LISZgNoD+0V2W2pJgcdrq5/4xZ+B0OvM88+uZOWfm/Uqac2bOOZ/zffrMmfmcz/f7nSeWAU8AVxe7lddPkpl7MnNTZm5asWLFYqeTJM2RRqNx0lKapkW7UyPiDKABNIFGZh4pNl0G7M/MZ4rHB4ArMjN7xFkFvJ6Z90XEJ4H7gQ8DHwPWA78s7T5Q7A47gBsy8zhwMCKOA+/JzJciYg1AeV3zp9lsntSdKkn9cuyZqmTRJC4z346IBE4DMiJWZuZbwIXAC6VdLwb2R8SXgH8D/gl4APhqZr6dmW9GxFkRcSVwPvAQreraAeC3HacdKHZ7p4g4HbgoM18uHp8NvJGZxyLiHOCV4vl31jV/pj15oJxEdj4vNRqNnrNTJTj1NeJrY371Ozv1KeCK0vJRWhMdLgWIiAuAzwGXAH8NfBn4ILCvnGQBPwOuBz6TmQcjYgewjVblrWyY2ABrgVURcR7wKvBdYHex7Spa3aid69JETTuJrJJeCUt5+7yx0qPF+BpRW79J3BO0xrN9v1g+CjwCfDYiXgTeAK4rZnseioiNwKrMvL8jzt3AN4HHIgJa1bBri67PsmFiQ2sc3MPF8e8DHsvMPcW2rcAXuqzPpF7VnvJ2adr8MJKk4fWVxGXmcxGxDngeWBcRy4ou1a4zPIETwB1d4iRwb/FvofMNHLuwAXgyM/eVnyy+G255Uf17Z32hNtSd1R5JkmZb3387NTPXZ+aJ9rLbPhGxKiL+J/CDzHx9bK3sP/YG4F86n8zMw5m5uXNd0vwatqt2Hrt4JVXTWP/sVma+CXxtnDH7jL0XOJKZW5bi3BrMYl25ix0rTYJdue8a5ZptHy9p8mbib6dm5t5pt0Hvsiu3WhabPDBIHM0mr1mpnmYiiZPUmxUnScMYtULbGWtY47oRLccbxjj/P9rxRmUSJ0mamnF/MLZjanRVqdBW5Ua0Kv8fZSZxkqSpqeIHo1QXfc9OlSRJUnWYxEmSJNWQSZwkSVINmcRJkiTVkEmcJElSDZnESZIk1ZBJnCRJUg2ZxEmSJNWQX/YrSZpLO3fuHPtfi1hIs9n0y401VlbiJElzaZIJ3DTOp9lnEidJklRDJnGSJEk15Jg4SROxa9cujh07NnKcRqPBLbfcMoYWSVK9mcRJmohxJHDjjCOpP6NOAHFCx9IxiZPmwKhVMKtf0vwadULGrE3oGOX9dNzvpY6Jk+bAqNUrq1+S1DLK++G430utxGnJDHK3YqVHktSvfj9fZv2zxSRuBvU7fmGpxykMcsdhpUfTtNg145geqVr6/cyY9c8Wu1NnUL/jD2ZtnII0rMWuBa8VSVU0UCUuIn4BXA78HLg8M08sSasGFBFPA1/MzFcX2OdM4EHgy8CDmXnNZFqnquhVbbHKoqrp7CqaVpdQVdqhd3XrRvT3Mr/6TuIi4qPAIWANcGiUBC4iNgM3AqtpJYS7M/PPw8brR2YejojVtKqPqyPi/Zl5aCnPqWrpVU2ZRpWlM6E0kVRZ54f0tLqEqtIOeDd5mfeEpdvvYNa7DNXbIN2pVwE/Ki0BiIj1EfGriPhNRPwlIjIibu8VJCKuAb4NfAf4PLAS+GGPfQeKXTrupoh4MSJei4ivlzb9BNhaWnY79saIeDYinj169Ohip5KG0pk42l0nLaydqJiwSO8aJIn7NK3kp70kIt4L7AO+lZlrgTuBe4DbFojzDeBx4HZaXbNbgN9HxCfKOw0Zm4jYBnwK2Ah8HLg1ItoVxyeAq0vLU2TmnszclJmbVqxYsdCpJEkT0mg0TlpK6rM7NSLOABpAE2hk5pFi02XA/sx8pnh8ALgiM7NHnFXA65l5X0R8Ergf+DDwMWA98MvS7gPFLtkB3JCZx4GDEXGcIlnNzJciYk172c/PLi2FZrN5Sneq1NZoNE4Zizbv5rkLVeqlryQuM9+OiAROAzIiVmbmW8CFwAulXS8G9kfEl4B/A/4JeAD4ama+nZlvRsRZEXElcD7wEK3q2gHgtx2n7RX7HOAG4EOtpuX17R0i4nTgosx8uXh8NvBGZh4rHp8DvNJe9vOza3Z0Jk7l5yfN8W9aSFUSFpPJ6un8nbSf03waZHbqU8AVpeWjtCY6XAoQERcAnwMuAf6a1izQDwL7MvPtUpyfAdcDn8nMgxGxA9hGq/JW1jV2Zh6KiAdodcdu7zhmLbAqIs4DXgW+C+wubb+KVldqe6k5YuIkDaYqyaTe5e9EZYOMies2nuwRYGVEvAjsAa7LzEOZ+a+0xqRtyMynOuLcDewHHouIX9Mat3Zt0f1Z1jV2RJxLa1zc9sz8Y8cxG4GHi2MPAL/LzD2l7VuBH5eWM6nfypJdeFLLYteC14pULf1WH2e9Stl3JS4zn4uIdcDzwLqIWFZ0qXad5QmcAO7oEieBe4t/C52vV+yf0qoG3hwR38vMP5S2bQCezMx9nQcV3xO3HPgTsDwzDy50/jqrSsWpW9l/oX2laanKNSOpP1YkWwb6st/MXF+sru+1TzF54U7gB5n5+ght69WGtQts3gDc1+O4w8Dm4uHmbvtovLzIJElaOmP/26mZ+SbwtXHHXcRe4EhmbpnweaVaGKQq2ut4SfOp16SwQY6fJaO8n477vXTsSdw0ZObeabdBqjKropKG5XCDk1Xp/XSQiQ2SNLRx3YFaFZSklpmoxEmqvirdvUrSLLASJ0mSVEMmcZIkSTVkEidJmkuTnjU5a7M0NX2OiZMkzSVnXarurMRJkiTVkEmcJElSDZnESZIk1ZBJnCRJUg2ZxEmSJNWQSZwkSVINmcRJkiTVkEmcJElSDZnESZIk1ZBJnCRJUg2ZxEmSJNWQSZwkSVINmcRJkiTVkEmcJElSDZnESZIk1dCyaTdAkiTVy65duzh27NgpzzcaDW655ZYptGg+jZTERcQvgMuBnwOXZ+aJsbTq1PP8Z2An8J+Ao8AXM/OfS9ufLp57tcfxZwIPZuY15fWlaKtUFzt37mT58uWnPN9sNrnrrrum0CJVSZU+pDvbUoU2TKsdVdHttbHQ81oaQydxEfFR4BCwBjg0SgIXEZuBG4HVtBLC3Zn559IuLwJXAzcD/3xqhIVl5uGIWB0R78/MQ+X1YdtcF1V48+vWlnl+86uKbgncQs8vtXJSaSI5fVX6kO48ZxXaMK12tLWvF6+Var13tD/nJvUZN0ol7irgR6UlABGxHtgN/A3wESCAOzLz1m5BIuIaYDuwA/h34KvAD4G/be+TmW8W+/bVsIi4CbgJ+CvgnszcDfwE2Ars7VjvPPZGWgklq1at6ut8VVaFN79u555mOyZ9kVW9HVVRTh6nlUhCdT4cq9IOVVP7GpnmtVIVVXnvgHc/2yb1GTfKxIZP00qG2ksi4r3APuBbmbkWuBO4B7htgTjfAB4HbqfVNbsF+H1EfGKYRkXENuBTwEbg48CtEbEMeIJWNY+O9ZNk5p7M3JSZm1asWDFMEyRJ0hxqNBonLZfaUJW4iDgDaABNoJGZR4pNlwH7M/OZ4vEB4IrMzB5xVgGvZ+Z9EfFJ4H7gw8DHgPXAL4do3g7ghsw8DhyMiOPAezLzpYhYA1Ben3WNRuOU7tQqtGWa7ahK1asq7aiKZrN5UpfItFSl6lWVdqia2tfLNK+VqqjKewdM/n19qCQuM9+OiAROAzIiVmbmW8CFwAulXS8G9kfEOcANwIdah+f1RZw3I+KsiLgSOB94iFbl7gDw20HbFRGnAxdl5svF47OBNzLzWNGGV4rn31mfdVVKFKrUFp38xtf5/DSYtFRL5w1g+flpt6UKbZhWO9qmfb1U6fUx7f+LaYoeRbLFD4y4g1aydRFwIDMfjYgbgEsz87qIuAD4R+CSYjLBh2h1mW7PzD+W4uwE1tHqgj0YETuAbcBlRTWtfM5v05rYcKLb7FRgFfD/aCWErwIPAv83M/cUcZuZ+b/K6wv9jB/4wAfyK1/5ylD/P5IkScO47bbbnsvMTYvtN8qYuPa4svL4skeAlRHxIrAHuK5I4M6lNS7upASucDewH3gsIn5NaxzbteUELiIui4h/oTXp4X7goYh4vEubNgIPF+04APwuM/cU27YCP+6yLkmSVDtDz07NzOciYh3wPLAuIpYVXapbu+z+U+Ap4OaI+F5m/qEUJ4F7i3+9zvV/gA19NGsD8GRm7is/WXw33PKi0vfOeh/xJEmSKmmkL/vNzPXF6vpF9ls7ynkGsAG4r8v5DwObO9clSZLqalb+7NZe4EhmbplyOyRJkiZiJpK4zNw77TZIkiRN0igTGyRJkjQlJnGSJEk1ZBInSZJUQyZxkiRJNWQSJ0mSVEMmcZIkSTVkEidJklRDJnGSJEk1ZBInSZJUQyZxkiRJNWQSJ0mSVEMz8bdTJUnS6Hbu3Mny5cuX/DzNZpO77rpryc8z66zESZIkgIkkcJM8z6yzEifNoF27dnHs2LEli99oNLjllluWLL4kaXEmcdIMWsoEbhLxJalt3Dels3QTahInaW74YVBN4xyH5Vir2TPum8ZZugk1iZM0N/wwqKZxjo8aR6xRk0oTydlWpdeHSdyMqNKLati2+MYnqQpGTQQdtD/bqvT6MImbEVV6UQ0byzc+aboGvQHzxkuaLr9iRJIEDH4j5Y2XNF1W4iRNRb+TDJw8IEndmcRJE9ary2reuqb6nRQwb5MHeiW3JrMCXx862UDdqRHxi4hY1l4uVaMGFRFPR8S5i+xzZkQ83l5OpmXSqXp1Qdk1JeidtM5bMqvufH2orO9ELCI+ChwC1gCHMvPEsCeNiM3AjcBq4OfA7sz887Dx+pGZhyNiNa3EdXVEvD8zDy3lOVU9nXex3r1KkupqkErcVcCPSksAImJ9RPwqIn4TEX+JiIyI23sFiYhrgG8D3wE+D6wEfthlv4Hidhx7U0S8GBGvRcTXS5t+AmwtLbsde2NEPBsRzx49erSf06lGOu9WvXuVJNXVIEncp2klP+0lEfFeYB/wrcxcC9wJ3APctkCcbwCPA7cDlwNbgN9HxCfaOwwZt33sNuBTwEbg48Ctpa7fJ4CrS8tTZOaezNyUmZtWrFix2OkkSZKmoq8kLiLOABpAE2hk5pFi02XA/sx8pnh8AFidmdkjzirg9cy8DwjgfuDvgKeB9aVdB4rbYQfw95l5PDMPAsfbP2dmvgSsaS/7iKUZ02g0FnwsSVJd9DUmLjPfjogETgMyIlZm5lvAhcALpV0vBvZHxDnADcCHWofn9UWcNyPirIi4EjgfeIhWhe0A8NtSnK5xASLiLOC/Af8VuAP4SnuniDgduCgzXy4enw28kZnHisfnAK+0l/387Jotjn9T1TUajZ6zDyVfHyobZIbpU8AVpeWjtCY6XAoQERcAnwMuycxDEfEArS7T7R1xfgZcD3wmMw9GxA5gG63qW1vXuACZ+R8R8TvgXuC/ZObxiGgftxZYFRHnAa8C3wV2l+JeRasrtb2UJq7ZbPb8ihHJGw0txNeHygZJ4p6gNZ7t+8XyUeAR4LMR8SLwBnBdkcCdS2v82vbM/GNHnLuBbwKPFcnXK8C1mXm8tE/XuAARsRI4DzhRVAPLNgIPF8e/D3gsM/eUtm8FvgD8Q7GUJm6evgtuIb0qCt32kySdqu8kLjOfi4h1wPPAuohYViRR3WZ5/pRWxe7miPheZv6hFCdpVdHuXeBcXeMWExT+B63ZrddGxJbMfLq0ywbgyczc1+XYM4HlwJ+A5cV4OUlTYkWhenpViRfaX9L0DPSFvZnZnnywfpH91g7dooXjngC+XDz871122QDc1+PYw8Dm4uHmbvtoPAb9ICgfJ2l6rBJL9VKZv7owor3AkczcMuV2TM2wiVP5+HHxg0BSnVXp/VTVU6XXx0wkcZm5d9ptmDYTJ0kaD99PtZAqvT4G+tupklRn454k4aSL8RhnZcIq2Ozxuu1tJipxktQPJ1NUU5UqG6oer9verMRJM2ip7zRn6U5WkurKSpw0g7xzlTSMUQftD3Iejc4kTpIkAXZt143dqZIkSTVkEidJklRDJnGSJEk1ZBInSZJUQ05skCRJU7dz586JzIztptls1nJSh5U4SZI0ddNK4KZ97lGYxEmSJNWQSZwkSVINOSZOkiSph127dnHs2LElid1oNEb6CzsmcZIk6RTjTl5GTVimZakSuHHENomTJE2VyUI1jTt5WcpkaF6ZxGmsxvFm7BuwNFmjXrejXrMmC9JwnNigsRrHm6dvwNJkjXrNec1K02ElTpoTw36RZl2/BFOSZp1JnDQnhv0yy7p+CaY0Dv12NTsMRNNgd6okST3021Vsl7KmYaBKXET8Argc+DlweWaeWJJWDSginga+mJmvLrDPmcCDwJeBBzPzmsm0bnoWuoOcx7vGXt2JdhdOVxV+L4t1NfsakVRFfSdxEfFR4BCwBjg0SgIXEZuBG4HVtBLC3Zn552Hj9SMzD0fEalrVx9UR8f7MPLSU55y2he4M5/GusdeH9DS6CzsT7HlMqtuq8HtZ7FyTfo10JpUmkZK6GaQSdxXwo9ISgIhYD+wG/gb4CBDAHZl5a7cgEXENsB3YAfw78FXgh8Dfduw3UNyOY28CbgL+CrgnM3cXm34CbC0t9y7+Y0vj15lEz2NSrd46k0bHJaqsnOSb4M+3QcbEfZpW8tNeEhHvBfYB38rMtcCdwD3AbQvE+QbwOHA7ra7ZLcDvI+IT7R2GjNs+dhvwKWAj8HHg1ohoJ6tPAFeXlt2OvzEino2IZ48ePbrY6SRJmqhyUm+CP9/6SuIi4gygATSBRmYeKTZdBuzPzGeKxweA1ZmZPeKsAl7PzPtoVdbuB/4OeBpYX9p1oLgddgB/n5nHM/MgcLz9c2bmS8Ca9rLbwZm5JzM3ZeamFStW9HE6SZKkyesricvMt4EETgMyIlYWmy4EXijtejGwPyLOiYjvRMTDEfG/S3HeBM6KiCuB84GHaFXYPgK8VorTNS5ARHwpIq6MlgeLBJNi2+nARZn5cvH4bOCNzDxWPD4HeKW97Odnl5ZCo9FY8LEk9dJsNruua/4MMibuKeCK0vJRWhMdLgWIiAuAzwGXZOahiHiAVpfp9o44PwOuBz6TmQcjYgewjVb1ra1r3GLbr2jNMP0gsC8z346I9nFrgVURcR7wKvBdWuPq2q6i1ZXaXmqONJvNnrMgJ21eJzGoP52vVT+oVeYYOLUNksQ9QWs82/eL5aPAI8BnI+JF4A3guiKBO5fW+LXtmfnHjjh3A98EHiuSr1eAazPzeGmfrnEBMvNfI2IjsCoz7++IvRF4uDj+fcBjmbmntH0r8AXgH4rlTGs0Ggt+xci88Y2vmqqQXPdqwzTaAr5WJfWn7yQuM5+LiHXA88C6iFiWmW/RSow6/ZRWxe7miPheZv6hFCeBe4t/vc7VK27bCeCOLs9vAJ7MzH2dG4rviVsO/AlYXoyXm2lWe1QHVUhYqtAGVdNCN8Od+0mTNtCX/WZme/LB+kX2Wzt0ixZQTIy4E/hBZr7eZZcNwH092nQY2Fw83NxtH0mSyrwZVpXV6m+nFhMjvtZl017gSGZumWiDpBpZrMtwoeMkSdVTqySul8zcO+02SFVnl6EkzZZBvuxXWtQ4xoU4tkSarFGvOa9ZaTpmohKn6nD8iFQ/075u+508MEg8jc7fS/WZxEmSpmraSaS68/dSfXanSpIk9bCUFcRRY1uJkyRJ6qHKFUkrcZIkSTVkEidJklRDJnGSJGnqpvnF4nX9UnPHxEmSpKnzC8kHZyVOkiSphkziJEmSasjuVEmSpJKdO3eyfPnyiZ+32WwO1K1sJU6SJKlkGgncMOc1iZMkSaohu1MlSVLl7Nq1i2PHji1J7EajUem/xNAvkzhJ0lSNe/zRoOOKVE1LlcAtdexJMonT2Izrjdg34PEZ951s3e9e/f84VRWu23GPP5rWeCZp0kziNDbjeuP0DXh8xn23Wfe7V/8/TuV1q8WMmuh7Y750TOIkSSoZtWI7CxXaslETdBP8pePsVEmSSkatsM5ChVb1YCVOM6/fu+pZu3uuOn8vkjQak7gZtdgYhnkao9DvXbF3z5Pl70WSRmMSN6MWG4PgGIXp6ZVgz1NiLUka3UBJXET8Argc+DlweWaeWJJWDSginga+mJmv9th+JvBgZl5TXp9gE6V39EqgTazV1tnVbJeypG76TuIi4qPAIWANcGiUBC4iNgM3AqtpJYS7M/PPw8ZbTGYejojVEfH+zDxUXl+qc0rSsDq7kO1SVqd2om+CP98GmZ16FfCj0hKAiFgfEb+KiN9ExF8iIiPi9l5BIuIa4NvAd4DPAyuBH3bZb6C4HcfeFBEvRsRrEfH14umfAFu7rHcee2NEPBsRzx49erSf00mSNFHtxN4Ef74NksR9mlby014SEe8F9gHfysy1wJ3APcBtC8T5BvA4cDutrtktwO8j4hPtHYaM2z52G/ApYCPwceDWiFgGPAFcXexWXj9JZu7JzE2ZuWnFihWLnU6SpIlrNBonLTWf+upOjYgzgAbQBBqZeaTYdBmwPzOfKR4fAK7IzOwRZxXwembeFxGfBO4HPgx8DFgP/HKYuB12ADdk5nHgYEQcB96TmS9FxBqA8rokSXVjF6qgzyQuM9+OiAROAzIiVmbmW8CFwAulXS8G9kfEOcANwIdah+f1RZw3I+KsiLgSOB94iFaF7QDw21KcrnEBesUutp0OXJSZLxePzwbeyMxjxXGvlGK80s/PLo1bs9nsOTtVglZ1pXNigyR1GmR26lPAFaXlo7QmOlwKEBEXAJ8DLikmDzxAq8t0e0ecnwHXA5/JzIMRsQPYRqv61tY1LkBmvrZA7LXAqog4D3gV+C6wu9h2Fa1u1M51aaL8GhEtxiqLpH4MMiauPY6sPJ7sEWBlRLwI7AGuKxK4c2mNX9uemX/siHM3raraYxHxa1rj1q4tuj/busYFWCT2RuDh4vgDwO8yc0+xbSvw4y7rM2mxqs48VX36rWJY7Zgsfy+SNJq+K3GZ+VxErAOeB9ZFxLKiS7XbLM+f0qrY3RwR38vMP5TiJHBv8a/XuXrFXTA2sAF4MjP3lQ8ovhtueVH5e2d9sZ+5zqz2vMuqRjX5e5Gk0Qz0Zb+Zub5YXb/IfmuHbtHibVgo9gbgvi7HHAY2d65LkiTV1az82a29wJHM3DLldkiSaq5zYskwx8+SXpOxBjleS2MmkrjM3DvtNmj0C70cR9JkeN2eyq7+kzk8p7pmIolTNXihV8+oFYVu8erM/49TVeG6HVciWY4nzQOTOGmGWVE4mf8f1VSFRFKqo0G+YkSSJGkilrLSPQtVdLASJ0mSKsjK+eKsxEmSJNWQSZwkSVLJtCbHDHpeu1MlSZJK6jLZJlp/BUvdRMR/AK9Nux2SJGmunJOZZy22k0mcJElSDTkmTpIkqYZM4iRJkmrIJE6SJKmGTOIkSZJqyCROkiSphkziJEmSasgkTpIkqYZM4iRJkmrIJE6SJKmG/j/d7gROHltX0wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1dfe71f6630>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 10))\n",
    "estimation_results['posterior'].plot_covariance()\n",
    "plt.xticks(rotation=90)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Diagnostics ##"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Jupyter Core        1.1.12077.0\n",
      "iqsharp             0.5.1903.2902\n",
      "qsharp              0.5.1903.2902\n"
     ]
    }
   ],
   "source": [
    "for component, version in sorted(qsharp.component_versions().items(), key=lambda x: x[0]):\n",
    "    print(f\"{component:20}{version}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.6.7 (default, Feb 28 2019, 07:28:18) [MSC v.1900 64 bit (AMD64)]\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.version)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
